是否有人有一樣的經驗,看別人的程式時,突然蹦出一個數字,例如
然後完全不知道這個東西是什麼。
這就是Magic Numbers,一個讓所有開發人員都會中斷思路的一個神祕數字。其實這個還滿常見的,特別是為了客制某些流程時,或者限制某些條件使用時,就會出現Magic Numbers,例如:
理論上Magic numbers是一種Constant,所以把他做為常數做管理就可以了,以上面的例子來看,就會寫成
const int LIMIT_TIME = 3600;
const int PORT 8080;
const string API_KEY = "60d77b84-6f00-4ffa-9ebc-c37c54f5c2e3";
....
....
server.SetCredentials(API_KEY, PORT);
server.SetTimeout(LIMIT_TIME);
這樣不但可以確認每個輸入值的意思,還可以確保放置的位置是正確的。對整體程式的可讀性會大大的增加。盡可能讓程式不要出現Magic Numbers,把所有寫死的參數變成變數甚至是常數,對於未來如何管理這些資料會增加很多彈性。
另外一件事是:如果Magic Numbers是透過運算出來的值(例如時間),最好還是保留他的運算方法在常數上,最常見的就是3600秒這種數字(60分鐘*60秒)。
把Magic Numbers常數化的例子很多,例如integer的最大/最小值,在C#就是包成constant
雖然Magic Numbers大多都是包成Constant,但實務上還是有一些不同的做法,例如:
1.放在設定檔裡,這是最常見的作法,像Connection String就會這樣做。
2.集中放在一個靜態常數類別裡,我還滿喜歡這種做法的,可以在一個地方直接管理所有的常數。
3.變成一個Enum,其實就是上面的方法變型而己,不同的地方在於放在類別的話,可以支援任何的資料型態,但放在Enum裡,可以支援的型態就比較少了(基本上就是文字還數字)。
其實Magic Numbers並不是一個什麼很特別的東西,但也就是這種小細節,會讓整個程式的可讀性提昇很多,如果在開發期間有看到類似的參數,不妨試著把他變成變數或常數,或者觀察看看自己正在做的專案裡有沒有Magic Numbers?怎麼做才會提昇可讀性呢?